home *** CD-ROM | disk | FTP | other *** search
File List | 1996-11-17 | 12.5 KB | 505 lines |
- '
- '
- '
- ' WOLFRAMS ZWEITES COMPUTERSPIEL (W.Z.C.S.)
- '
- '
- '
- '
- ' von Wolfram Rösler 27/7/88
- '
- '
- '
- ' ==========================
- ' Quellcode in GFA-Basic 2.0
- ' ==========================
- '
- DEFLIST 0
- VOID FRE(0)
- '
- ' Compiler-Optionen
- '
- OPTION BASE 1
- OPTION "B+"
- OPTION "E-"
- OPTION "T-"
- OPTION "U0"
- '
- ' Bildschirm-Initialisierung
- '
- HIDEM
- DEFFILL 1,2,4
- PBOX 3,3,550,396
- GRAPHMODE 2
- DEFTEXT 1,16,0,32
- TEXT 10,33,"W.Z.C.S."
- DEFTEXT ,,900
- TEXT 580,396,399,"Wolframs Zweites ComputerSpiel"
- DEFTEXT ,,,13
- TEXT 610,396,396,"von Wolfram Rösler, Augustastr. 44-46, D-5100 Aachen"
- TEXT 630,396,396,"geschrieben 27.7.88 in GFA-Basic 2.0 - public domain"
- DEFTEXT 1,0,0,13
- TEXT 5,195,"Grundmuster:"
- GRAPHMODE 1
- '
- ' Variablen-Vorbelegung und Konstanten-Definition
- '
- DIM x%(4),y%(4),button%(@but.anz,4),balls%(4,8),ballx%(4,8),bally%(4,8),ordnung%(4,8)
- rad%=80 ! Radius der 4 großen Räder
- brad%=61 ! Radius, auf dem die Kugeln liegen
- grundmuster%=1 ! aktuelles Grundmuster
- ercnt%=0 ! Fehlerzähler
- intlen%=VARPTR(x%(2))-VARPTR(x%(1)) ! bytes pro Integer var.
- DEFFN but.anz=24 ! Anzahl der Buttons
- '
- ' Dateninitialisierung
- '
- ' Buttons (crazy about buttons ? Call W-Germany 0241/529317 to rent a superb button machine)
- RESTORE buttons
- FOR j%=1 TO @but.anz
- @make.button(j%)
- NEXT j%
- ' Rahmen um Grundmuster #1
- BOX button%(13,1)+2,button%(13,2)+2,button%(13,3)-2,button%(13,4)-2
- '
- ' Koordinaten der Räder
- RESTORE circ.coord
- FOR j%=1 TO 4
- READ x%(j%),y%(j%)
- NEXT j%
- '
- ' Koordinaten der Bälle
- p45=PI*45
- p22.5=PI*22.5
- FOR j%=1 TO 4
- FOR j1%=1 TO 8
- ballx%(j%,j1%)=x%(j%)+SIN((p45*(j1%-1)-p22.5)/180)*brad%
- bally%(j%,j1%)=y%(j%)+COS((p45*(j1%-1)-p22.5)/180)*brad%
- NEXT j1%
- NEXT j%
- '
- ' Anfangsfarben der Kugeln
- @circ(j%)
- '
- ' Räder zeichnen
- @ball.init
- '
- ' Hauptschleife
- '
- SHOWM
- mainloop:
- ON ERROR GOSUB err
- DO
- REPEAT
- x%=MOUSEX
- y%=MOUSEY
- UNTIL MOUSEK<>0
- @check.button
- IF button%<>0 ! irgendwas angeklickt
- IF button%<13 OR button%>20 ! Button außer Grundmuster 1-8
- DEFFILL 1,1
- GRAPHMODE 3
- PBOX button%(button%,1),button%(button%,2),button%(button%,3),button%(button%,4)
- GRAPHMODE 1
- ENDIF
- @do.it(button%)
- IF button%<13 OR button%>20 ! Wie oben
- DEFFILL 1,1
- GRAPHMODE 3
- PBOX button%(button%,1),button%(button%,2),button%(button%,3),button%(button%,4)
- GRAPHMODE 1
- ENDIF
- ENDIF
- LOOP
- ' END ist in Proc. "do.it"
- '
- ' Prozeduren
- '
- PROCEDURE make.button(n%) ! Buttons initialisieren
- LOCAL x%,y%,l%,h%,a$
- DEFFILL 0
- READ x%,y%,l%,h%
- button%(n%,1)=x%
- button%(n%,2)=y%
- button%(n%,3)=l%
- button%(n%,4)=h%
- PBOX x%,y%,l%,h% ! Bereich löschen
- BOX x%,y%,l%,h% ! Rahmen
- DRAW l%+1,y% TO l%+1,h%+1 TO x%,h%+1 ! Schatten
- IF n%<=10 ! Pfeilbutton
- READ x%,y%,l%,h%
- DEFLINE 1,3,0,1
- LINE x%,y%,l%,h%
- DEFLINE 1,1,0,0
- ELSE ! Funktionsbutton
- READ x%,y%,a$
- TEXT x%,y%,57,a$
- ENDIF
- RETURN
- PROCEDURE ball.init ! Initialisieren des Grundmusters
- LOCAL j%
- IF grundmuster%=1
- RESTORE ball.col.1
- ENDIF
- IF grundmuster%=2
- RESTORE ball.col.2
- ENDIF
- IF grundmuster%=3
- RESTORE ball.col.3
- ENDIF
- IF grundmuster%=4
- RESTORE ball.col.4
- ENDIF
- IF grundmuster%=5
- RESTORE ball.col.5
- ENDIF
- IF grundmuster%=6
- RESTORE ball.col.6
- ENDIF
- IF grundmuster%=7
- RESTORE ball.col.7
- ENDIF
- IF grundmuster%=8
- RESTORE ball.col.8
- ENDIF
- IF grundmuster%=9
- RESTORE ball.col.9
- ENDIF
- FOR j%=1 TO 4
- FOR j1%=1 TO 8
- READ balls%(j%,j1%)
- NEXT j1%
- NEXT j%
- BMOVE VARPTR(balls%(1,1)),VARPTR(ordnung%(1,1)),intlen%*DIM?(balls%())
- CIRCLE 320,200,50 ! kleines Rad
- FOR j%=1 TO 4
- CIRCLE x%(j%),y%(j%),rad% ! Umrißlinien der Räder
- @balls(j%) ! Kugeln in die Räder
- NEXT j%
- RETURN
- PROCEDURE circ(n%) ! Rad # n% zeichnen
- LOCAL j%
- FOR j%=1 TO 4
- DEFFILL 1,2,15
- PCIRCLE x%(j%),y%(j%),rad% ! Bereich löschen
- DEFFILL 0
- PCIRCLE x%(j%),y%(j%),5 ! Nabenbereich löschen
- CIRCLE x%(j%),y%(j%),5 ! Nabe zeichnen
- NEXT j%
- RETURN
- PROCEDURE balls(m%) ! Kugeln auf Rad # m% zeichnen
- LOCAL j%
- IF m%<5 ! große Räder
- FOR j%=1 TO 8
- DEFFILL 1,2,balls%(m%,j%)
- PCIRCLE ballx%(m%,j%),bally%(m%,j%),10
- NEXT j%
- ELSE ! kleines Rad
- FOR j%=1 TO 2
- DEFFILL 1,2,balls%(1,j%)
- PCIRCLE ballx%(1,j%),bally%(1,j%),10
- DEFFILL 1,2,balls%(3,j%+4)
- PCIRCLE ballx%(3,j%+4),bally%(3,j%+4),10
- NEXT j%
- ENDIF
- RETURN
- PROCEDURE check.button ! checken, ob und welcher Button gedrückt
- LOCAL j%,a%,b%,c%,d% ! x% und y% sind global (Mauskoord.)
- button%=0 ! Rückgabevariable (global)
- FOR j%=1 TO @but.anz
- a%=button%(j%,1)
- b%=button%(j%,2)
- c%=button%(j%,3)
- d%=button%(j%,4)
- IF x%>=a% AND y%>=b% AND x%<=c% AND y%<=d%
- button%=j%
- ENDIF
- NEXT j%
- RETURN
- PROCEDURE do.it(b%) ! b%: Nr. des gedrückten Buttons
- LOCAL j%,s%,n%,f$
- IF b%<9 ! senkrechte Pfeile
- IF b% MOD 2=0 ! nach rechts drehen
- n%=b%/2
- s%=balls%(n%,1)
- FOR j%=1 TO 7
- balls%(n%,j%)=balls%(n%,j%+1)
- NEXT j%
- balls%(n%,8)=s%
- @adept(n%)
- @balls(n%)
- ELSE ! nach links drehen
- n%=(b%+1)/2
- s%=balls%(n%,8)
- FOR j%=8 DOWNTO 2
- balls%(n%,j%)=balls%(n%,j%-1)
- NEXT j%
- balls%(n%,1)=s%
- @adept(n%)
- @balls(n%)
- ENDIF
- ELSE
- ' Inneren Kreis drehen
- IF b%=9 ! nach rechts
- s%=balls%(1,2)
- balls%(1,2)=balls%(1,1)
- balls%(1,1)=balls%(4,3)
- balls%(3,6)=balls%(3,5)
- balls%(3,5)=s%
- @adept(1)
- @adept(3)
- @balls(5)
- ENDIF
- IF b%=10 ! nach links
- s%=balls%(1,1)
- balls%(1,1)=balls%(1,2)
- balls%(1,2)=balls%(3,5)
- balls%(3,5)=balls%(3,6)
- balls%(3,6)=s%
- @adept(1)
- @adept(3)
- @balls(5)
- ENDIF
- ' Andere Buttons
- IF b%=11 ! Mischen
- @do.it(RANDOM(10)+1)
- ENDIF
- IF b%=12 ! Ordnen
- BMOVE VARPTR(ordnung%(1,1)),VARPTR(balls%(1,1)),intlen%*DIM?(balls%())
- FOR j%=1 TO 4
- @balls(j%)
- NEXT j%
- ENDIF
- IF b%>=13 AND b%<=20 ! Grundmuster 1 bis 8
- g%=grundmuster%+12
- ' Rahmen um altes Grundmuster-Feld löschen u. neuen Rahmen zeichnen
- COLOR 0
- BOX button%(g%,1)+2,button%(g%,2)+2,button%(g%,3)-2,button%(g%,4)-2
- COLOR 1
- BOX button%(b%,1)+2,button%(b%,2)+2,button%(b%,3)-2,button%(b%,4)-2
- grundmuster%=b%-12
- @ball.init
- ENDIF
- IF b%=21 ! Editor
- @editor
- ENDIF
- IF b%=22 ! Speichern
- FILESELECT "\*.WCS","",f$
- IF f$<>""
- IF EXIST(f$)
- ALERT 3,"Datei gibts -|Ok zum löschen ?",1,"Ja|Nein",s%
- ELSE
- s%=1
- ENDIF
- IF s%=1
- VOID FRE(0)
- BSAVE f$,VARPTR(balls%(1,1)),intlen%*DIM?(balls%())
- ENDIF
- ENDIF
- ENDIF
- IF b%=23 ! Laden
- FILESELECT "\*.WCS","",f$
- IF f$<>""
- VOID FRE(0)
- BLOAD f$,VARPTR(balls%(1,1))
- BMOVE VARPTR(balls%(1,1)),VARPTR(ordnung%(1,1)),intlen%*DIM?(balls%())
- FOR j%=1 TO 4
- @balls(j%)
- NEXT j%
- ENDIF
- ENDIF
- IF b%=24 ! Ende
- ALERT 0,"Wirklich Ende ?",1,"Ja|Nein",s%
- IF s%=1
- END
- ENDIF
- ENDIF
- ENDIF
- RETURN
- PROCEDURE adept(n%) ! alle Räder an # n% anpassen
- IF n%=1
- balls%(2,6)=balls%(1,3)
- balls%(2,7)=balls%(1,2)
- balls%(4,4)=balls%(1,1)
- balls%(4,5)=balls%(1,8)
- ENDIF
- IF n%=2
- balls%(1,3)=balls%(2,6)
- balls%(1,2)=balls%(2,7)
- balls%(3,5)=balls%(2,8)
- balls%(3,4)=balls%(2,1)
- ENDIF
- IF n%=3
- balls%(2,1)=balls%(3,4)
- balls%(2,8)=balls%(3,5)
- balls%(4,3)=balls%(3,6)
- balls%(4,2)=balls%(3,7)
- ENDIF
- IF n%=4
- balls%(1,8)=balls%(4,5)
- balls%(1,1)=balls%(4,4)
- balls%(3,6)=balls%(4,3)
- balls%(3,7)=balls%(4,2)
- ENDIF
- RETURN
- PROCEDURE editor
- LOCAL bl$,x%,y%,j%,j1%,current%,bx%,by%,g%
- current%=1
- g%=grundmuster%+12
- COLOR 0
- BOX button%(g%,1)+2,button%(g%,2)+2,button%(g%,3)-2,button%(g%,4)-2
- COLOR 1
- grundmuster%=9
- GET 551,0,640,400,bl$
- DEFFILL 0
- PBOX 551,0,640,400 ! Editor-Bereich löschen
- DEFTEXT 1,1,0,32
- FOR j%=1 TO 6
- TEXT 560,40*j%,MID$("EDITOR",j%,1)
- NEXT j%
- DEFTEXT 1,0,0,13
- FOR j%=1 TO 24
- DEFFILL 1,2,j%
- PCIRCLE 620,j%*15,10 ! Auswahlkreise
- NEXT j%
- DEFLINE 1,3,0,1
- LINE 600,current%*15,610,current%*15 ! Pfeil
- DEFLINE 1,1,0,0
- BOX 560,375,630,395 ! "Fertig"-Button
- DRAW 631,375 TO 631,396 TO 560,396 ! Schatten desselben
- TEXT 563,390,64,"Fertig"
- DO
- REPEAT
- x%=MOUSEX
- y%=MOUSEY
- UNTIL MOUSEK
- EXIT IF x%>=560 AND y%>=375 AND x%<=630 AND y%<=395 ! Fertig-Button geklickt
- IF x%>=600 AND y%<=370 ! Farbe angeklickt
- DEFFILL 0
- PBOX 600,current%*15-10,610,current%*15+10
- current%=MAX(1,y%\15)
- DEFLINE 1,3,0,1
- LINE 600,current%*15,610,current%*15
- DEFLINE 1,1,0,0
- ELSE ! Kreis angeklickt ?
- FOR j%=1 TO 4
- FOR j1%=1 TO 8
- bx%=ballx%(j%,j1%)
- by%=bally%(j%,j1%)
- IF x%>=bx%-10 AND x%<=bx%+10 AND y%>=by%-10 AND y%<=by%+10 ! falls ja
- DEFFILL 1,2,current%
- PCIRCLE bx%,by%,10
- balls%(j%,j1%)=current%
- @adept(j%)
- ENDIF
- NEXT j1%
- NEXT j%
- ENDIF
- LOOP
- BMOVE VARPTR(balls%(1,1)),VARPTR(ordnung%(1,1)),intlen%*DIM?(balls%())
- PUT 551,0,bl$
- RETURN
- PROCEDURE err
- LOCAL i%,x$
- INC ercnt%
- RESTORE ertext
- FOR j%=1 TO ercnt%
- READ x$
- IF x$=">>"
- RESTORE ertext
- READ x$
- ercnt%=0
- ENDIF
- NEXT j%
- ALERT 3,x$+"|Fehler # "+STR$(ERR),1,"Abbruch",i%
- RESUME mainloop
- RETURN
- '
- ' DATAs
- '
- '
- circ.coord:
- DATA 320,120,400,200,320,280,240,200
- '
- ball.col.1:
- DATA 8,8,1,1,1,1,1,7
- DATA 3,3,3,3,3,1,8,8
- DATA 5,5,5,3,8,8,5,5
- DATA 7,5,8,8,7,7,7,7
- '
- ball.col.2:
- DATA 1,1,1,1,1,1,1,1
- DATA 2,8,8,8,8,1,1,1
- DATA 2,2,2,2,2,2,2,2
- DATA 8,2,2,1,1,8,8,8
- '
- ball.col.3:
- DATA 1,1,8,8,8,8,8,8
- DATA 8,8,8,8,8,8,1,1
- DATA 8,8,8,8,1,1,8,8
- DATA 8,8,1,1,8,8,8,8
- '
- ball.col.4:
- DATA 16,19,19,1,1,1,1,16
- DATA 13,2,2,2,2,19,19,13
- DATA 7,7,7,13,13,14,14,7
- DATA 8,14,14,16,16,8,8,8
- '
- ball.col.5:
- DATA 7,7,7,13,13,13,13,7
- DATA 7,13,13,13,13,7,7,7
- DATA 13,13,13,7,7,7,7,13
- DATA 13,7,7,7,7,13,13,13
- '
- ball.col.6:
- DATA 8,8,8,8,9,9,8,8
- DATA 8,8,24,24,8,8,8,8
- DATA 16,16,8,8,8,8,8,8
- DATA 8,8,8,8,8,8,22,22
- '
- ball.col.7:
- DATA 13,13,8,12,12,12,12,8
- DATA 8,7,7,7,7,8,13,13
- DATA 22,22,22,8,13,13,8,22
- DATA 5,8,13,13,8,5,5,5,5
- '
- ball.col.8:
- DATA 8,8,8,8,8,8,8,11
- DATA 11,8,8,8,8,8,8,8
- DATA 11,11,11,11,8,11,11,11
- DATA 11,11,11,8,11,11,11,11
- '
- buttons:
- DATA 278,15,318,35,308,25,288,25
- DATA 322,15,362,35,332,25,352,25
- DATA 485,158,505,198,495,189,495,168
- DATA 485,202,505,242,495,212,495,232
- DATA 322,365,362,385,332,375,352,375
- DATA 278,365,318,385,308,375,288,375
- DATA 130,202,150,242,140,212,140,232
- DATA 130,158,150,198,140,188,140,168
- DATA 465,15,505,55,475,25,495,45
- DATA 130,345,170,385,140,355,160,375
- DATA 5,60,65,80,7,75,Mischen
- DATA 5,120,65,140,7,135,Ordnen
- DATA 5,200,25,220,12,215,1
- DATA 30,200,50,220,37,215,2
- DATA 55,200,75,220,62,215,3
- DATA 5,225,25,245,12,240,4
- DATA 30,225,50,245,37,240,5
- DATA 55,225,75,245,62,240,6
- DATA 5,250,25,270,12,265,7
- DATA 30,250,50,270,37,265,8
- DATA 55,250,75,270,62,265,E
- DATA 5,290,65,310,7,305,Speichern
- DATA 5,315,65,335,7,330,Laden
- DATA 5,365,65,385,7,380,Ende
- '
- ertext:
- DATA Oh nein! Welch Schrecken!,Es schüttelt mich grausam ...,Was ist das ?
- DATA Weh mir !,Irgendwas stimmt nicht ...,Pass doch auf Mann !
- DATA Ich glaub ich spinn -,Du hast es geschafft !,>>
- '
- '
- ' The End
-